#!/bin/bash

# 检查参数：确保用户提供了目标 Rust 文件路径
if [ $# -ne 1 ]; then
    echo "使用方法：$0 <目标Rust文件路径>"
    echo "示例：$0 src/main.rs"
    exit 1
fi

# 定义目标文件路径，并检查文件是否存在
RUST_FILE="$1"
if [ ! -f "$RUST_FILE" ]; then
    echo "错误：文件 '$RUST_FILE' 不存在或不是常规文件"
    exit 1
fi

# 提取纯文件名（用于头部注释）
FILE_NAME=$(basename "$RUST_FILE")

# 核心逻辑：
# 1. 先输出头部的「文件名注释」
# 2. 读取原文件内容，通过 sed 分步骤移除所有 Rust 风格注释
# 步骤说明：
# - 第一步：移除 /* */ 块注释（包括多行块注释）
# - 第二步：移除 //、///、//! 开头的单行注释（包括行内注释，如 let x = 1; // 注释）
# - 第三步：删除因移除注释产生的空行（可选，保留则删除这行）
sed -E "
    # 头部添加文件名注释（仅在第一行前插入）
    1i // 原文件：$FILE_NAME
    # 第一步：处理 /* */ 块注释（支持多行）
    :block_comment  # 定义标签，用于循环处理嵌套/多行块注释
    s/\/\*[^*]*\*\///g  # 匹配 /* 开头、*/ 结尾且中间无 * 的块注释（基础情况）
    t block_comment     # 如果上一步有替换，继续循环处理（处理嵌套或残留）
    s/\/\*.*//g         # 处理剩余的 /* 开头但未闭合的块注释（极端情况）
    s/.*\*\///g         # 处理剩余的 */ 结尾但未开启的块注释（极端情况）
    # 第二步：处理 //、///、//! 单行注释（包括行内注释）
    s/\/\/\/.*//g       # 移除 /// 文档注释
    s/\/\/\!.*//g       # 移除 //! 模块文档注释
    s/\/\/.*//g         # 移除 // 单行注释（包括行内注释）
    # 第三步：删除空行（可选，不需要删除空行则删除这行）
    /^[[:space:]]*$/d
" "$RUST_FILE"
